#pragma once
#include <Log.h>
#include <Channel.h>
#include <sys/epoll.h>
#include <unordered_map>
#include <vector>
#include <assert.h>

#define MAXEVENTSLEN 1024

// Poller模块只负责epoll模型的直接操作

namespace muduo{
    class Poller{
    private:
        // epoll模型文件描述符
        int _epfd;
        // 保存就绪事件的事件数组
        struct epoll_event _evs[MAXEVENTSLEN];
        // 管理channel的unorderd_map(管理所有的管理文件描述符操作的对象)
        std::unordered_map<int, Channel*> _channels;
    private:
        void Update(Channel* channel,int op);
        bool HasChannel(Channel* channnel);
    public:
        int get();
        Poller();
        // 添加或修改事件监控
        void UpdateEvent(Channel* channel);
        // 删除事件监控
        void RemoveEvent(Channel* channel);
        // 返回就绪事件
        void ActiveEvent(std::vector<Channel*>* evs);
    };
}